YUV420到RGB在OpenGL ES中的纹理转换

您所在的位置:网站首页 opengl x11 YUV420到RGB在OpenGL ES中的纹理转换

YUV420到RGB在OpenGL ES中的纹理转换

#YUV420到RGB在OpenGL ES中的纹理转换| 来源: 网络整理| 查看: 265

我必须转换和显示YUV420P图像到RGB彩色空间使用AMD在飞思卡尔iMX53处理器(OpenGL ES 2.0,EGL)。Linux操作系统,没有X11。为了实现这一点,我应该能够创建一个保存YUV420P数据的适当映像:这可以是一个YUV420P/Y 12图像类型,也可以是3个简单的8位映像,每个组件(Y、U、V)一个。

glTexImage2D被排除在外,因为速度慢,YUV420P帧是实时视频解码@25 can的结果,使用glTexImage2D,我们无法保持所需的帧数。

还有一种选择: eglCreateImageKHR/glEGLImageTargetTexture2DOES.唯一的问题是,这些文件不能处理任何适合YUV420 420/ be 12数据的图像格式。

EGLint attribs[] = { EGL_WIDTH, 800, EGL_HEIGHT, 480, EGL_IMAGE_FORMAT_FSL, EGL_FORMAT_YUV_YV12_FSL, EGL_NONE }; EGLint const req_attribs[] = { EGL_RED_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_BLUE_SIZE, 5, EGL_ALPHA_SIZE, 0, EGL_SAMPLES, 0, EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; ... display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, NULL, NULL); eglBindAPI(EGL_OPENGL_ES_API); eglChooseConfig(display, req_attribs, config, ARRAY_SIZE(config), &num_configs); ctx = eglCreateContext(display, curr_config, NULL, NULL); surface = eglCreateWindowSurface(display, curr_config, fb_handle, NULL); ... EGLImageKHR yuv_img = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NEW_IMAGE_FSL, NULL, attribs); eglQueryImageFSL(display, yuv_img, EGL_CLIENTBUFFER_TYPE_FSL, (EGLint *)&ptr); glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, yuv_img);

GlEGLImageTargetTexture2DOES(.)失败了。如果我将“attribs”中的适当行改为:

EGL_IMAGE_FORMAT_FSL,EGL_FORMAT_RGB_565_FSL,

然后,图像可以被分配到一个OpenGL ES纹理,但它不适合持有8位数据(Y/U/V)或Y 420/Y 12数据。搜索网络(包括飞思卡尔社区论坛),我还没有找到任何解决方案。

如何创建这样的图像:

是快速的创造;最终可以分配给已经存在的缓冲区(给出物理地址或虚拟地址);可在片段/顶点着色程序中执行YUV -> RGB转换;

约束是为了避免由于性能原因而不必要的memcpy(.)s。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3